#include <iostream>
#include <cstdio>
#include <string>
#include "ASTNode.h"
#include "SymbolTable.h"
#include "CodeGenerator.h"
#include "Optimizer.h"
#include "typecheck.h"

extern int yyparse();
extern FILE* yyin;
extern ASTNode* root;

int main(int argc, char **argv) {
    // 支持重定向输入输出，方便本地测试
    // 用法：./compiler < input_file.tc > output_file.s
    // 或者：./compiler test.c
    // 或者：./compiler -opt test.c (启用优化)
    
    bool enableOptimization = false;
    std::string inputFile;
    
    // 解析命令行参数
    for (int i = 1; i < argc; i++) {
        std::string arg = argv[i];
        if (arg == "-opt") {
            enableOptimization = true;
        } else if (arg[0] != '-') {
            // 非选项参数，应该是输入文件
            if (inputFile.empty()) {
                inputFile = arg;
            }
        }
    }
    
    // 设置输入源
    if (!inputFile.empty()) {
        // 有命令行参数指定的文件，从文件读取
        FILE* file = fopen(inputFile.c_str(), "r");
        if (!file) {
            std::cerr << "Error: Cannot open file '" << inputFile << "'" << std::endl;
            return 1;
        }
        yyin = file;
    } else {
        // 没有命令行参数，从标准输入读取
        yyin = stdin;
    }

    yyparse();

    if (root) {
        // 类型检查
        TypeChecker typeChecker;
        typeChecker.check(root);
        // 构建符号表
        SymbolTableBuilder symbolBuilder;
        symbolBuilder.build(root);
        
        // 根据参数决定是否应用优化器
        if (enableOptimization) {
            std::cerr << "Optimization enabled" << std::endl;
            Optimizer optimizer;
            optimizer.optimize(root);
        }
        
        // 生成RISC-V汇编代码
        CodeGenerator codeGen;
        codeGen.generate(root);
        // 只输出汇编代码到stdout
        codeGen.printCode();
        // delete root; // 不需要手动delete，ASTNode用unique_ptr管理
    }

    // 关闭文件（如果是从文件读取的话）
    if (!inputFile.empty() && yyin != stdin) {
        fclose(yyin);
    }

    return 0;
} 